#pragma once

#include <string>
#include <vector>
#include "kernel/agv/agv_entity.h"

namespace kernel {
namespace task {

/**
 * @brief 子任务类型枚举
 * @details 纯领域枚举，不依赖任何框架
 */
enum class SubTaskType {
    Move,       // 移动任务
    Jack,       // 顶升任务
    Lift,       // 电梯任务
    Charge,     // 充电任务
    Park,       // 泊车任务
    Unknown     // 未知类型
};

/**
 * @brief 子任务配置DTO
 * @details 纯数据传输对象，描述单个子任务的配置信息
 *          Clean Architecture: kernel层DTO，无依赖
 */
struct SubTaskConfigDTO {
    SubTaskType type{SubTaskType::Unknown};

    // Move任务参数
    std::string stationName;
    int floor{1};
    std::string operation;

    // Jack任务参数
    std::string operationStation;
    bool isUp{false};
    int waitTimeSeconds{6};

    // Lift任务参数
    int liftNum{0};
    int callFloor{0};
    int aimFloor{0};

    // Charge任务参数
    std::string chargePoint;
    int targetBatteryLevel{100};

    // Park任务参数
    std::string parkingStation;

    /**
     * @brief 检查配置有效性
     * @return 错误消息（空表示有效）
     */
    std::string validate() const;
};

/**
 * @brief 任务模板配置DTO
 * @details 描述一个完整任务链的配置
 *          对应三方代码中的 TaskChain 配置
 */
struct TaskTemplateConfigDTO {
    std::string name;               // 任务名称
    std::string mutexTask;          // 互斥任务名称（与该任务互斥的任务）
    int callerNum{0};               // 呼叫器编号（用于呼叫器触发任务）
    std::vector<SubTaskConfigDTO> subTasks;  // 子任务列表
    std::vector<agv::AgvType> allowedAgvTypes;  // 允许执行该任务的车型列表（空表示所有车型）

    /**
     * @brief 检查配置有效性
     * @return 错误消息（空表示有效）
     */
    std::string validate() const;
};

/**
 * @brief 任务系统配置DTO
 * @details 整个任务系统的配置，包含所有任务模板
 */
struct TaskSystemConfigDTO {
    std::vector<TaskTemplateConfigDTO> templates;  // 任务模板列表

    /**
     * @brief 根据名称查找任务模板
     * @param name 任务名称
     * @return 任务模板指针（未找到返回nullptr）
     */
    const TaskTemplateConfigDTO* findTemplate(const std::string& name) const;

    /**
     * @brief 检查配置有效性
     * @return 错误消息（空表示有效）
     */
    std::string validate() const;
};

} // namespace task
} // namespace kernel
